package com.note.app.service;

import com.note.app.dto.collaboration.CollaborationOperationDTO;
import com.note.app.dto.collaboration.CollaborationParticipantDTO;
import com.note.app.dto.collaboration.CollaborationSessionDTO;
import com.note.common.domain.CollaborationSession;

import java.util.List;

/**
 * 协作服务接口
 */
public interface CollaborationService {
    
    /**
     * 创建协作会话
     *
     * @param userId 用户ID
     * @param noteId 笔记ID
     * @param name 会话名称
     * @return 会话信息
     */
    CollaborationSessionDTO createSession(Long userId, Long noteId, String name);
    
    /**
     * 关闭协作会话
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean closeSession(Long sessionId, Long userId);
    
    /**
     * 加入协作会话
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param accessToken 访问令牌
     * @return 参与者信息
     */
    CollaborationParticipantDTO joinSession(Long sessionId, Long userId, String accessToken);
    
    /**
     * 离开协作会话
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean leaveSession(Long sessionId, Long userId);
    
    /**
     * 获取会话信息
     *
     * @param sessionId 会话ID
     * @return 会话信息
     */
    CollaborationSessionDTO getSessionInfo(Long sessionId);
    
    /**
     * 获取用户的协作会话列表
     *
     * @param userId 用户ID
     * @return 会话列表
     */
    List<CollaborationSessionDTO> getUserSessions(Long userId);
    
    /**
     * 获取笔记的协作会话
     *
     * @param noteId 笔记ID
     * @return 会话列表
     */
    List<CollaborationSessionDTO> getNoteActiveSessions(Long noteId);
    
    /**
     * 处理协作操作
     *
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param operationType 操作类型
     * @param position 位置
     * @param content 内容
     * @return 操作信息
     */
    CollaborationOperationDTO handleOperation(Long userId, Long sessionId, int operationType, String position, String content);
    
    /**
     * 获取操作历史
     *
     * @param sessionId 会话ID
     * @param limit 限制数量
     * @return 操作历史
     */
    List<CollaborationOperationDTO> getOperationHistory(Long sessionId, int limit);
    
    /**
     * 更新参与者权限
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param participantId 参与者ID
     * @param role 角色
     * @return 是否成功
     */
    boolean updateParticipantRole(Long sessionId, Long userId, Long participantId, int role);
    
    /**
     * 更新光标位置
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param position 位置
     * @return 是否成功
     */
    boolean updateCursorPosition(Long sessionId, Long userId, String position);
    
    /**
     * 保存协作内容到笔记
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean saveToNote(Long sessionId, Long userId);
} 